package boardData;

/**
 * Klasse die relevante Daten und Methoden eines Elements des Boards enth�llt.
 * @author Fabian Hewer
 * @version V0.a.2 (6.7.'11)
 *
 */
public class BoardElement {
	//Variablen
//	private boolean occupied = false;
//	private boolean colourWhite;
//	private boolean valid = false;
//	private char piece;
	private int pieceInt; //Speichert Figur und kram durch die Integerwerte, die in der Boardklasse definiert sind.
	
	//Konstanten
	private static final String WRONG_PIECE = "Angegebene Figur gibt es nicht: ";
	private static final String NEED_MORE_PARAS = "Fehlende Parameter!";

	//--// Konstruktoren
	public BoardElement(int pieceData) {
		pieceInt = pieceData;
	}
	
	public BoardElement() {
		pieceInt = Board.ILLEGAL_FIELD;
	}
	//--//
	
	/**
	 * Methode die zwei BoardElemente miteinander auf gleiche Stellung vergleicht.
	 * @param testElement Element, dass mit diesem verglichen werden soll
	 * @return true wenn auf beiden Feldern der selbe Figurentyp der selben farbe steht.
	 */
	public boolean matches(BoardElement testElement) {
		return (this.pieceInt == testElement.pieceInt);
	}
	
	/**
	 * Methode die die Farbe der auf dem Feld stehenden Figur zur�ckgibt.
	 * @return true wenn wei� (Achtung! gibt auch etwas zur�ck, wenn keine Figur auf dem Feld steht oder das Feld nicht gültig ist!
	 * Auf isoccupied() und isValid() pr�fen!)
	 */
	boolean isWhite() { //"default" visibility daher im Package benutzbar
		if(pieceInt == Board.ILLEGAL_FIELD)
			return false;
		else if(pieceInt > 0)
			return true;
		return false;
	}
	
	/**
	 * Methode die angibt ob das Feld besetzt ist
	 * @return true wenn das Feld besetzt ist (oder Illegal)
	 */
	boolean isOccupied() {
		if (pieceInt != Board.EMPTY_FIELD)
			return true;
		return false;
	}
	
	/**
	 * Methode die das Feld vom Besetztstatus befreit
	 */
	void notOccupied() {
		pieceInt = Board.EMPTY_FIELD;
	}
	
	/**
	 * Gibt die Figur zur�ck, die auf dem Feld steht
	 * @return Figur die auf dem Feld steht in englischer Notation (p,r,b,n,k,q) und 'e' wenn das Feld leer ist.
	 */
	int getPiece() {
		return pieceInt;
	}
	
	/**
	 * Methode die den Typ der Figur auf dem Feld festlegt.
	 * @param piece Figur in englischer Notation (p,r,b,n,k,q).
	 */
	void setPiece(int pieceData) {
		pieceInt = pieceData;
	}
		
	/**
	 * Methode die zur�ckgibt ob ein Feld ein g�ltiges Feld ist. (Also Teil des Schachfelds)
	 * @return true wenn das Feld g�ltig ist.
	 */
	boolean isValid() {
		if (pieceInt != Board.ILLEGAL_FIELD)
			return true;
		return false;
	}
	
	public String toString() {
		String ausgabe = "n/v";
			switch(pieceInt) {
				case Board.EMPTY_FIELD:		ausgabe = ("___"); break;
				case Board.BLACK_BISHOP: 	ausgabe = (" b "); break;
				case Board.BLACK_KING:		ausgabe = (" k "); break;
				case Board.BLACK_KNIGHT:	ausgabe = (" n "); break;
				case Board.BLACK_PAWN:		ausgabe = (" p "); break;
				case Board.BLACK_QUEEN:		ausgabe = (" q "); break;
				case Board.BLACK_ROOK:		ausgabe = (" r "); break;
				case Board.WHITE_BISHOP:	ausgabe = (" B "); break;
				case Board.WHITE_KING:		ausgabe = (" K "); break;
				case Board.WHITE_KNIGHT:	ausgabe = (" N "); break;
				case Board.WHITE_PAWN:		ausgabe = (" P "); break;
				case Board.WHITE_QUEEN:		ausgabe = (" Q "); break;
				case Board.WHITE_ROOK:		ausgabe = (" R "); break;
			}
		return ausgabe;
	}
}
